package com.huatai.common.util;

import com.huatai.common.config.JwtProperties;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.nio.charset.StandardCharsets;
import java.util.Date;
import java.util.Map;

@ConfigurationProperties("jwt.config")
@Getter
@Setter
@Component
public class JwtUtils {
	//签名私钥
	private String key;
	//签名的失效时间
	private Long ttl;

	/**
	 * 设置认证token
	 * id:登录用户id
	 * subject：登录用户名
	 */
	public String createJwt(String id, String name, Map<String, Object> map) {
		//1.设置失效时间
		long now = System.currentTimeMillis();//当前毫秒
		long exp = now + ttl;
		//2.创建jwtBuilder
		JwtBuilder jwtBuilder = Jwts.builder().setId(id).setSubject(name)
			.setIssuedAt(new Date())
			.signWith(SignatureAlgorithm.HS256, key);
		//3.根据map设置claims
		for (Map.Entry<String, Object> entry : map.entrySet()) {
			jwtBuilder.claim(entry.getKey(), entry.getValue());
		}
		jwtBuilder.setExpiration(new Date(exp));
		//4.创建token
		String token = jwtBuilder.compact();
		return token;
	}


	/**
	 * 解析token字符串获取clamis
	 */
	public Claims parseJwt(String token) {
		try {
			return Jwts.parser().setSigningKey(JwtProperties.getTokenKey().getBytes(StandardCharsets.UTF_8)).parseClaimsJws(token).getBody();
		}catch (Exception e){
			return null;
		}
	}
}
